package aaa.config;
/*
@Date:2025/6/18
*/
/**
 * Spring Web应用初始化类（替代传统web.xml配置）
 * @author 路老师
 * @date 2025/6/14
 * 无精神，不编程！无乐趣，不编程！
 * "调试：与bug共舞的艺术。"
 * 功能说明：
 * 1. 完全替代web.xml的配置方式
 * 2. 基于Java配置初始化Spring MVC环境
 */

// 导入Spring相关过滤器类
import org.springframework.web.filter.CharacterEncodingFilter;
// 导入Spring MVC初始化基类
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
// 导入Servlet相关接口和类
import javax.servlet.Filter;
import javax.servlet.ServletContext;
import javax.servlet.SessionTrackingMode;
// 导入Java集合类
import java.util.EnumSet;

/**
 * 继承AbstractAnnotationConfigDispatcherServletInitializer类
 * 实现基于注解的Spring MVC初始化配置
 */
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
     * 获取根应用上下文配置类（父容器）
     * @return 配置类数组
     * 说明：配置非Web相关的Bean（数据源、事务、服务层等）
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{AppConfig.class}; // 返回根配置类
    }

    /**
     * 获取Servlet应用上下文配置类（子容器）
     * @return 配置类数组
     * 说明：配置Web相关Bean（控制器、视图解析器等）
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class}; // 返回Web配置类
    }

    /**
     * 配置DispatcherServlet的映射路径
     * @return 映射路径数组
     * 说明："/"表示处理所有请求（除静态资源外）
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"}; // 映射到根路径
    }

    /**
     * 注册Servlet过滤器
     * @return 过滤器数组
     * 说明：此处配置字符编码过滤器
     */
    @Override
    protected Filter[] getServletFilters() {
// 创建字符编码过滤器
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("utf-8"); // 设置编码格式
        encodingFilter.setForceEncoding(true); // 强制使用指定编码
        return new Filter[]{encodingFilter}; // 返回过滤器数组
    }

    /**
     * 注册DispatcherServlet时的额外配置
     * @param servletContext Servlet上下文对象
     */
    @Override
    protected void registerDispatcherServlet(ServletContext servletContext) {
        super.registerDispatcherServlet(servletContext); // 调用父类实现

// 配置会话跟踪模式（仅使用Cookie）
        servletContext.setSessionTrackingModes(
                EnumSet.of(SessionTrackingMode.COOKIE) // 禁用URL重写
        );
    }
}

/**
 * 这个初始化类主要完成以下功能：
 *
 * ‌替代web.xml‌：
 * 完全取代传统web.xml配置方式
 * 基于Java代码实现Spring MVC环境初始化
 * ‌双上下文配置‌：
 * 根上下文（父容器）：AppConfig.class（业务逻辑、数据访问层）
 * Servlet上下文（子容器）：WebConfig.class（控制器、视图等Web组件）
 * ‌核心配置‌：
 * DispatcherServlet映射到根路径("/")
 * 强制UTF-8字符编码过滤器
 * 会话跟踪模式配置（仅使用Cookie）
 * ‌技术特点‌：
 * 纯Java配置（无XML）
 * 支持Servlet 3.0+规范
 * 模块化配置（分离Web和非Web组件）
 * 此类在Servlet 3.0+容器（如Tomcat 7+）启动时自动加载，是Spring MVC应用的标准入口配置。
 */

/**
 * 一、Web组件
 * Web组件是Spring框架中专门用于处理Web请求和响应的部分，它们与Web环境紧密相关，通常用于构建Web应用程序。
 *
 * DispatcherServlet‌：
 *
 * ‌功能‌：作为Spring MVC的前端控制器，负责接收所有的HTTP请求，并根据配置将它们分发给相应的处理器（Controller）。
 * ‌特点‌：是Web组件的核心，负责整个请求处理流程的控制和调度。
 * Controller‌：
 *
 * ‌功能‌：处理具体的业务逻辑，接收请求参数，调用服务层方法，并返回响应结果。
 * ‌特点‌：通常使用@Controller或@RestController注解标记，与Web请求直接相关。
 * ViewResolver‌：
 *
 * ‌功能‌：负责将逻辑视图名解析为实际的视图对象（如JSP、Thymeleaf等）。
 * ‌特点‌：在Web应用中用于渲染页面，返回给客户端。
 * HandlerMapping和HandlerAdapter‌：
 *
 * ‌功能‌：HandlerMapping负责根据请求URL找到对应的处理器（Controller），而HandlerAdapter则负责调用处理器并处理返回值。
 * ‌特点‌：是Spring MVC中请求处理流程的重要组成部分，与Web请求紧密相关。
 * ‌拦截器（Interceptor）‌：
 *
 * ‌功能‌：在请求处理前后执行一些额外的逻辑，如日志记录、权限验证等。
 * ‌特点‌：通过实现HandlerInterceptor接口来定义，与Web请求的处理流程相关。
 * 二、非Web组件
 * 非Web组件是Spring框架中不依赖于Web环境的部分，它们提供了更通用的功能，如依赖注入、面向切面编程、事务管理等。
 *
 * IoC容器（ApplicationContext）‌：
 *
 * ‌功能‌：负责创建、配置和管理Bean对象，实现依赖注入。
 * ‌特点‌：是Spring框架的核心，不依赖于Web环境，可以在任何Java应用中使用。
 *
 * AOP支持‌：
 * ‌功能‌：提供面向切面编程的支持，允许开发者将横切关注点（如日志、事务等）从业务逻辑中分离出来。
 * ‌特点‌：通过切面（Aspect）、切点（Pointcut）和通知（Advice）等概念实现，与Web环境无关。
 * ‌数据访问支持‌：
 *
 * ‌功能‌：提供对JDBC、ORM框架（如Hibernate、MyBatis）等的支持，简化数据访问操作。
 * ‌特点‌：包括JdbcTemplate、JpaTemplate等工具类，以及事务管理等功能，不依赖于Web环境。
 * ‌事务管理‌：
 *
 * ‌功能‌：提供声明式和编程式事务管理的支持，确保数据的一致性和完整性。
 * ‌特点‌：通过@Transactional注解或编程方式实现，与Web环境无关。
 * ‌集成测试支持‌：
 *
 * ‌功能‌：提供对集成测试的支持，包括Mock对象、测试上下文管理等。
 * ‌特点‌：帮助开发者编写更高效的测试用例，不依赖于Web环境。
 */